#include <iostream>
using namespace std;
#include<vector>
#include<math.h>
typedef long long ll;
vector<vector<ll>>dp;

int main()
{
	int m, n, x, y;
	cin >> n >> m >> x >> y;
	dp = vector<vector<ll>>(n + 2, vector<ll>(m + 2, 0));
	for (int i = 0; i < n + 1; ++i)
	{
		for (int j = 0; j < m + 1; ++j)
		{
			if ((1 == abs(x - i) && abs(j - y) == 2) || (abs(x - i) == 2 && abs(j - y) == 1) || (i == x && j == y))
			{
				continue;
			}
			if (i == 0 && j == 0)
			{
				dp[i + 1][j + 1] = 1;
			}
			else
			{
				dp[i + 1][j + 1] = dp[i][j + 1] + dp[i + 1][j];
			}
		}
	}
	cout << dp[n + 1][m + 1];
	return 0;
}
//
//vector<vector<bool>>check;
//int num = 0;
//void dfs(vector<vector<int >>& grid, int row, int col, int x, int y)
//{
//	if (row < 0 || col<0 || row>=grid.size() || col >= grid[0].size() || (1 == abs(x - row) && abs(col - y) == 2) || (abs(x - row) == 2 && abs(col - y) == 1)||(row==x&&col==y))
//	{
//		return;
//	}
//
//	if (row == grid.size() - 1 && col == grid[0].size() - 1)
//	{
//		num++;
//	}
//	dfs(grid, row + 1, col, x, y);
//	dfs(grid, row, col + 1, x, y);
//
//}
//
//int main()
//{
//	int m, n, x, y;
//	cin >> n >> m >> x >> y;
//	vector<vector<int>>grid(n+1, vector<int>(m+1, 0));
//	dfs(grid, 0, 0, x, y);
//	cout << num;
//	return 0;
//}


//typedef long long ll;
//int main()
//{
//    ll n;
//    scanf("%lld", &n);
//    vector<ll>arr(n, 0);
//    ll x = n, i = 0;
//    while (x--)
//    {
//        scanf("%d", &arr[i++]);
//    }
//    ll num = 0;
//
//    vector<ll>dp2(n + 1, 0);
//    vector<ll>dp1(n + 1, 0);
//    ll Min = 10001;
//    for (int i = 0; i < n - 1; ++i)
//    {
//        if (arr[i] < Min)
//        {
//            Min = arr[i];
//
//        }
//        dp2[i + 1] = Min;
//    }
//
//    for (ll i = 1; i < n; ++i)
//    {
//        dp1[i] = arr[i] - dp2[i];
//        if (num < dp1[i])
//        {
//            num = dp1[i];
//        }
//    }
//    printf("%lld\n", num);
//    return 0;
//}


//class Solution
//{
//public:
//    bool check(string& s)
//    {
//        int left = 0, right = s.size() - 1;
//        while (left < right)
//        {
//            if (s[left] == s[right])
//            {
//                left++;
//                right--;
//            }
//            else
//            {
//                return false;
//            }
//        }
//        return true;
//    }
//    int getLongestPalindrome(string A)
//    {
//        if (A.size() == 1)
//        {
//            return 1;
//        }
//        int num = 0;
//        for (int i = 0; i < A.size(); ++i)
//        {
//            string ret(A.begin() + i, A.end());
//            for (int j = A.size() - 1; j >= i; --j)
//            {
//                if (check(ret))
//                {
//                    if (j - i + 1 > num)
//                    {
//                        num = j - i + 1;
//                        break;
//                    }
//                }
//                ret.pop_back();
//
//            }
//
//        }
//        return num;
//    }
//};
//
//int main()
//{
//    string ret = "abcba";
//    cout << getLongestPalindrome(ret) << endl;
//    return 0;
//}